#include "Mutex.h"

#include <iostream>
#include <assert.h>

using namespace std;

/*
 * Esta clase es un wrapper del pthread_mutex. Facilita la comprensión
 * del código agrupando el control de errores en un solo lugar.
 */

Mutex::Mutex() {
	int err = pthread_mutex_init(&this->pthread_mutex, NULL);
	if (err != 0)
		cerr << "Error al crear el mutex" << endl;
	assert(err == 0);
	// Colocamos los assert afuera de la condición.
}

Mutex::~Mutex() {
	// Se libera el mutex antes de destruirlo
	this->unlock();

	int err = pthread_mutex_destroy(&this->pthread_mutex);
	if (err != 0)
		cerr << "Error al destruir el mutex" << endl;
	assert(err == 0);
}

void Mutex::lock() {
	int err = pthread_mutex_lock(&this->pthread_mutex);
	if (err != 0)
		cerr << "Error al obtener el mutex" << endl;
	assert(err == 0);
}

void Mutex::unlock() {
	int err = pthread_mutex_unlock(&this->pthread_mutex);
	if (err != 0)
		cerr << "Error al liberar el mutex" << endl;
	assert(err == 0);
}
